/**
 * 作用：返回一个指定对象的指定事件集合。在这个事件集合中，可以直接定位到事件的位置。
 * 范围：不管是原生的Dom事件，还是通过jQuery代理的事件，都是可以获取得到的。而且，获取到的jQuery代理事件是直接可见的。
 * 因为getEventListeners 方法是在谷歌中的方法，还不知道在其他浏览器中是否存在，所以下面定义的方法最好是在谷歌中使用。
 * @ele DOM对象
 * @event_ 事件名，不要前面的 on，例如：click
 **/
function getEvens(ele, event_, options = {}) {
    if (!ele && !event_) return;
    var data = {},
        num = 0;
    class tt {
        constructor() {
            this.events = data; // 查询到的所有事件集合
            this.ele = ele; // 要查询的DOM对象
            this.event_ = event_; // 要查询的事件名

            this.options = Object.assign({
                '$': $
            }, options)

            this.listeners();
            this.$events();
            console.log(data);
        }
        listeners() { // 获取原生js绑定的事件
            if (!getEventListeners) return;
            var listeners = getEventListeners(this.ele)[this.event_]
            if (!listeners) return;
            for (let index = 0; index < listeners.length; index++) {
                var str = listeners[index]['listener'].toString()
                if (!/function\(\w\){return/ig.test(str)) {
                    data[num++] = listeners[index]['listener']
                }
            }
        }
        $events() { // 获取jQuery绑定的事件
            if (this.options.$) {
                var $events = this.options.$._data(this.ele, "events")[this.event_];
                if (!$events) return;
                for (let index = 0; index < $events.length; index++) {
                    data[num++] = $events[index]['handler']
                }
            }
        }
        show() { // 显示全部事件
            console.log('========== 开始 ===========');
            for (const key in data) {
                if (Object.hasOwnProperty.call(data, key)) {
                    console.log(data[key]);
                }
            }
            console.log('========== 结束 ===========');
            return this;
        }
        setEle(ele) { // 重新设置DOM对象
            this.ele = ele;
            data = {};
            num = 0;
            this.listeners();
            this.$events();
            console.log(data);
            return this;
        }
        setEvent_(event_) { // 重新设置事件名称。
            this.event_ = event_;
            data = {};
            num = 0;
            this.listeners();
            this.$events();
            console.log(data);
            return this;
        }
    }
    return new tt();
}

// 用法；
getEvens($("#toolsDisplay")[0], 'click').show()